package planificadorrr2;

import java.util.Random;

public class ManejoDeProcesos {
    private Procesos[] proces;
    private Procesos pro;
    private int ind;
    private int proceso=-1;
    
    public ManejoDeProcesos(int num){
        proces = new Procesos[num];
        ind=-1;
    }
    
    public void muestraInfoProceso(String hilo){
    }
    
    public synchronized void crearProcesos(String hilo,int mem){
        while (ind==proces.length-1){
            try{    
               wait();
            }catch(InterruptedException e){}
            }
        proceso++;
        ind++;
        pro= new Procesos(proceso,mem);
        proces[ind]=pro;
        notifyAll();
        }
    
    public synchronized void enlistaProcesos(String hilo, ManejoDeProcesos pro, int mem) {
        while (pro.ind<0){
            try{
                wait();
            }catch (InterruptedException e){}
        }
        if(mem-proces[0].getTamano()<0){
            System.out.println();
        }
        else{
            ind++;
            proces[ind]=pro.proces[0];
            System.out.println("");
            for(int i=0;i<pro.ind;i++){
                pro.proces[i]=pro.proces[i+1];
            }
            pro.ind--;
            mem-=proces[ind].getTamano();
            muestraInfoProceso(hilo);
        }
        notifyAll();
    }
    
    public synchronized void procesoEjecucion(String h, ManejoDeProcesos listos, int max){
        Random r=new Random();
        Procesos aux;
        while (ind < 0) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        aux = proces[0];
        max += aux.getTamano();

        for (int i = 0; i < ind; i++) {
            proces[i] = proces[i + 1];
        }
        ind--;

        System.out.println("\n" + h + ": Entra a ejecución " + aux.getNombre() + ".Rafaga restante: " + aux.getRafaga());
        Procesos.RestaQ(aux,PlanificadorRR2.quantum);
        /*try {
            wait((int) (Math.random() * 10000));
        } catch (InterruptedException e) {}*/
        
        
        if (aux.getRafaga() == 0) {
            System.out.println("\n" + aux.getNombre() + " termina su ejecución y pasa a terminado.");
        } else {
            int bloqueado=r.nextInt(2);
            if (bloqueado==0) {
                System.out.println("\n" + h + ": Termina su quantum " + aux.getNombre() + ".Rafaga Restante: " + aux.getRafaga());
                System.out.println("\n" + aux.getNombre() + " Pasa a bloqueado...");
                try {
                    wait((int) (Math.random() * 10000));
                } catch (InterruptedException e) {
                }
                listos.ind++;
                listos.proces[listos.ind] = aux;
                System.out.println("\n" + aux.getNombre() + " Termina su tiempo Bloqueado.....Entrá a Listos.");
                System.out.print("\nCola de Procesos Listos:");
                for (int i = 0; i <= listos.ind; i++) {
                    System.out.print(listos.proces[i].getNombre() + "Rafaga Restante: " + listos.proces[i].getRafaga());
                }
                System.out.println();

            } else {
                System.out.println("\n" + h + ": Termina su quantum " + aux.getNombre() + ". Rafaga Restante: " + aux.getRafaga());
                listos.ind++;
                listos.proces[listos.ind] = aux;
                System.out.println("\n" + aux.getNombre() + " Entra a Listos.");
                System.out.print("\nCola de Procesos Listos:");
                for (int i = 0; i <= listos.ind; i++) {
                    System.out.print(listos.proces[i].getNombre() + "Rafaga Restante: " + listos.proces[i].getRafaga());
                }
                System.out.println();
            }

        }
        notifyAll();
    }
    
    
    }
            

